package com.ms.controller;



import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ms.annotation.AdminOnly;
import com.ms.annotation.AdminOrOrganizerOnly;
import com.ms.entity.Place;
import com.ms.entity.PlaceRecord;
import com.ms.service.inter.PlaceService;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.*;


@RestController // 标记为REST接口，返回JSON
@RequestMapping("/place") // 统一接口前缀
public class PlaceController {

    @Autowired// 注入PlaceService（也可用@Autowired）
    private PlaceService placeService;

    /**
     * 接收Place对象和图片文件并保存到数据库（仅管理员可操作）
     * @param place 前端传入的Place对象
     * @param file 上传的图片文件
     * @return 保存结果（true=成功，false=失败）
     */
    @AdminOnly // 只有管理员才能添加场地
    @PostMapping("/save")
    public boolean savePlace(@RequestPart Place place, 
                             @RequestParam(required = false) MultipartFile file) throws Exception {
        // 处理文件上传
        if (file != null && !file.isEmpty()) {
            // 生成唯一文件名
            String originalFileName = file.getOriginalFilename();
            String extension = "";
            if (originalFileName != null && originalFileName.contains(".")) {
                extension = originalFileName.substring(originalFileName.lastIndexOf("."));
            }
            String uniqueFileName = UUID.randomUUID().toString() + extension;
            
            // 确保目录存在
            String uploadDir = System.getProperty("user.dir") + "/src/main/resources/static/P_place/";
            File dir = new File(uploadDir);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            
            // 保存文件
            Path path = Paths.get(uploadDir + uniqueFileName);
            Files.copy(file.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING);
            
            // 将文件路径保存到场地对象的pl_picture字段
            place.setPlPicture("/P_place/" + uniqueFileName);
        }
        
        // 设置创建时间
        place.setPlCreateTime(new Date());
        
        return placeService.save(place); // 调用MyBatis-Plus的save方法
    }
    
    /**
     * 根据场地ID获取场地详细信息，包括图片信息
     * 该方法供管理员和主办方访问，用于在前端展示场地详情
     * 
     * @param placeId 场地ID
     * @return 包含场地详细信息和图片URL的响应结果
     */
    @AdminOrOrganizerOnly // 只有管理员和主办方才能访问
    @GetMapping("/detail")
    public Map<String, Object> getPlaceDetail(@RequestParam("placeId") Integer placeId) {
        Map<String, Object> result = new HashMap<>();
        
        try {
            // 根据ID查询场地信息
            Place place = placeService.getById(placeId);

            // 检查场地是否存在
            if (place == null) {
                result.put("success", false);
                result.put("msg", "场地不存在");
                return result;
            }
            
            // 构造返回结果
            result.put("success", true);
            result.put("data", place); // 包含场地信息和图片路径
            result.put("msg", "获取成功");
            
        } catch (Exception e) {
            result.put("success", false);
            result.put("msg", "获取失败: " + e.getMessage());
        }
        
        return result;
    }
    
    /**
     * 获取所有场地列表
     * 该方法供管理员和主办方访问，用于在前端展示场地列表
     * 
     * @return 包含所有场地信息的响应结果
     */
    @AdminOrOrganizerOnly // 只有管理员和主办方才能访问
    @GetMapping("/list")
    public Map<String, Object> getAvailablePlaces() {
        Map<String, Object> result = new HashMap<>();
        
        try {
            // 查询所有场地
            List<Place> places = placeService.list();
            
            // 构造返回结果
            result.put("success", true);
            result.put("data", places);
            result.put("msg", "获取成功");
            
        } catch (Exception e) {
            result.put("success", false);
            result.put("msg", "获取失败: " + e.getMessage());
        }
        
        return result;
    }
    

}